Vuejsv-if ✐v-if 指令可以決定是否渲染元素,該元素只有在填入的 expression 為 truthy 時會渲染。
下方為簡單範例,當 type 被切換時,畫面重新渲染,v-if expression 為 falsy 的元素將被銷毀,反之為 truthy 的元素將被建立:
const vm = new Vue({
name: "vm",
el: '#app',
template: `
<div id="app">
<p v-if="type === 'A'">渲染這個 ⏰</p>
<p v-else-if="type === 'B'">渲染那個 ⏱</p>
<p v-else="type === 'C'">渲染最後 ⏲</p>
</div>
`,
data: {
type: 'B'
},
});
更改 type 影響 expression 結果,下圖可以看到如下重新渲染過程:

v-else、v-else-if 連用 ✐如同 if、else,v-if 可以與指令 v-else、v-else-if 連用。
v-else-if 前一個 兄弟元素 需要為 v-if、v-else-if
v-else 前一個 兄弟元素 需要為 v-if、v-else-if
const vm = new Vue({
name: "vm",
el: '#app',
template: `
<div id="app">
<p v-if="type === 'A'">渲染這個 ⏰</p>
<p v-else-if="type === 'B'">渲染那個 ⏱</p>
<p v-else="type === 'C'">渲染最後 ⏲</p>
</div>
`,
data: {
type: 'B'
},
});
<template>,條件渲染多個內容 ✐若要同時條件渲染多個元素,可以使用 <template> 包裹。
const vm = new Vue({
name: "vm",
el: "#app",
template: `
<div id="app">
<template v-if="loginType === 'username'">
<label>Username</label>
<input placeholder="Enter your username" >
</template>
<template v-else>
<label>Email</label>
<input placeholder="Enter your email address">
</template>
<button @click="change">BTN</button>
</div>
`,
data: {
loginType: "username",
},
methods: {
change() {
this.loginType = "other";
},
},
});
key 管理複用元素 ✐Vue 會高效的渲染元素,通常會 復用 既有元素並且 重新渲染 部分 相異之處 而非 從頭渲染,這帶給我們更為高效的渲染速度,但是在部分情況下,也會帶來問題。渲染 input 時,由於並非從頭渲染,而是替換掉了 placeholder,在切換時 value 仍然存留,會帶來以下問題:

我們可以看到由於渲染時並非重新渲染的整個 input 而是替換了 placeholder,於是用戶輸入的 value 仍存在。
此時可以使用 key 來解決該問題,表達元素是 完全獨立 的,Vue 遇到 key 時會基於 key 變化重新排列元素順序,並且移除 key 不存在的元素。
更改後加上 key 的代碼:
const vm = new Vue({
name: "vm",
el: "#app",
template: `
<div id="app">
<template v-if="loginType === 'username'">
<label>Username</label>
<input placeholder="Enter your username" key="user">
</template>
<template v-else>
<label>Email</label>
<input placeholder="Enter your email address" key="email">
</template>
<button @click="change">BTN</button>
</div>
`,
data: {
loginType: "username",
},
methods: {
change() {
this.loginType = "other";
},
},
});
可以看到 input 綁上 key 後,被整個重新渲染,剛剛的問題也迎刃而解。

同樣是條件,v-show 是使用 display:none 決定元素是否顯示在畫面中,元素始終會被渲染。
const vm = new Vue({
name: "vm",
el: "#app",
template: `
<div id="app">
<label v-show="value">A</label>
<label v-show="!value">B</label>
<button @click="change">BTN</button>
</div>
`,
data: {
value: false,
},
methods: {
change() {
this.value = !this.value;
},
},
});
透過切換 display,v-show 得以達到切換元素顯現的效果。

同為條件渲染,v-if 與 v-show 差別總結如下:
v-if 所條件渲染的元素會隨 expression 渲染、銷毀,並且確保相關的事件監聽器、子組件被適當地銷毀、重建,總結來說 v-if 有更高的切換開銷,每切換一次就要重新渲染,不適用於頻繁切換的元素。
v-show 所條件渲染的元素總是渲染,使用 CSS 進行切換。v-show初始渲染成本較高,但是切換時開銷不高,適用於頻繁切換顯示的元素。
以上為此次內容,感謝看到這裡的你,我們明天見。
若是文中有任何錯誤、錯字、想討論的內容,歡迎各位大大不吝鞭笞指正、交流分享,筆者不慎感激 ✦ ✦ ✦
▶︎ 筆者 github:https://github.com/YUN-RU-TSENG
▶︎ 老王賣瓜之筆者另一篇鐵人:每天來點 CSS Specification
▶︎ 倘若不斷向深處扎根,似乎就能茁壯成長 - RM